home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / drdobbs / 1987 / 12 / tracy / tracy.lst next >
File List  |  1987-11-13  |  14KB  |  209 lines

  1. ( LOAD screen for DDJ Standard Prelude and String Extension)    
  2. ( MJT  Aug 30 1987 for DDJ December 1987)                       
  3.                                                                 
  4. (     2 LOAD ( Standard prelude)                                
  5.       3 LOAD ( Augmented interpretation)                        
  6.    4  5 THRU ( Controlled words)                                
  7.    6 13 THRU ( Strings)                                         
  8.                                                                 
  9.                                                                 
  10.                                                                 
  11.                                                                 
  12.                                                                 
  13.                                                                 
  14.                                                                 
  15.                                                                 
  16.                                                                 
  17. ( FORTH-83 functions-- typical definitions)                     
  18. ( Adjust these words for your Forth.    See DDJ Oct 1987.)      
  19. ( Note: functions already provided need not be redefined.)      
  20. : RECURSE   [COMPILE] MYSELF ;  IMMEDIATE                       
  21. : INTERPRET   INTERPRET ;                                       
  22.                                                                 
  23. : I> ( - 'data)   COMPILE R> ;  IMMEDIATE                       
  24. : >I ( - 'data)   COMPILE >R ;  IMMEDIATE                       
  25.                                                                 
  26. ( Used for alignment: )                                         
  27. : ALIGN    ( HERE 1 AND ALLOT) ;                                
  28. : REALIGN  ( a - a' )  ( DUP 1 AND +) ;                         
  29.                                                                 
  30. 2 CONSTANT CELL   : CELL+   2+ ;    : CELLS   2* ;              
  31.                                                                 
  32. : UNDO   I> R> R> 2DROP >I ;  \ Undoes a DO-- LOOP.             
  33. ( Required definitions - used to support further compilation)   
  34.                                                                 
  35. : THRU ( n n2)   1+ SWAP DO  I LOAD  LOOP ;                     
  36. \ LOADS screens n through n2.                                   
  37.                                                                 
  38. : \   >IN @ 64 + -64 AND >IN ! ;  IMMEDIATE                     
  39. \ comment to end of line.  For use in screens only.             
  40.                                                                 
  41. : \\   1024 >IN ! ;  IMMEDIATE                                  
  42. \ stops interpreting or compiling screen immediately.           
  43.                                                                 
  44. : \IF ( f )   0= IF  [COMPILE] \  THEN ;  IMMEDIATE             
  45. \ conditional interpretation or compilation.                    
  46.                                                                 
  47. : NEED ( - f)   32 ( ie blank) WORD FIND  SWAP DROP  0= ;       
  48. \ true if the following word is in the search order.            
  49. \ FORTH-83 Controlled Words                                     
  50.                                                                 
  51. NEED  2* \IF  :  2*    DUP  + ;                                 
  52. NEED D2* \IF  : D2*   2DUP D+ ;                                 
  53.                                                                 
  54. NEED HEX \IF  : HEX   16 BASE ! ;                               
  55. NEED  C, \IF  : C, ( n )   HERE 1 ALLOT C! ;                    
  56.                                                                 
  57. NEED BL \IF  32 CONSTANT BL                                     
  58.                                                                 
  59. NEED ERASE \IF  : ERASE ( a n)   00 FILL ;                      
  60. NEED BLANK \IF  : BLANK ( a n)   BL FILL ;                      
  61.                                                                 
  62. NEED .R \IF  : .R ( n width)   >R DUP 0< R> D.R ;               
  63.                                                                 
  64.                                                                 
  65. \ DDJ Forth Column Controlled Words                             
  66. NEED 2>R                                                        
  67. \IF : 2>R   COMPILE SWAP COMPILE >R COMPILE >R ;  IMMEDIATE     
  68. NEED 2R>                                                        
  69. \IF : 2R>   COMPILE R> COMPILE R> COMPILE SWAP ;  IMMEDIATE     
  70. NEED @EXECUTE \IF  : @EXECUTE   @ EXECUTE ;                     
  71.                                                                 
  72. NEED AGAIN                                                      
  73. \IF  : AGAIN   0 [COMPILE] LITERAL [COMPILE] UNTIL ;  IMMEDIATE 
  74. NEED DLITERAL                                                   
  75. DUP \IF  : DLITERAL  SWAP [COMPILE] LITERAL [COMPILE] LITERAL ; 
  76.     \IF   IMMEDIATE                                             
  77.                                                                 
  78. NEED S>D  \IF  : S>D  ( n - d)    DUP 0< ;                      
  79. NEED WITHIN   \IF  : WITHIN ( n n2 n3 - f)  OVER - >R - R> U< ; 
  80. NEED TRUE \IF  -1 CONSTANT TRUE                                 
  81. \ String primitives                                             
  82.                                                                 
  83. : /STRING ( a n n2 - a+n2 n-n2)   ROT OVER +  ROT ROT - ;       
  84. \ truncates leftmost n chars of string.  n may be negative.     
  85.                                                                 
  86. VARIABLE CTEMP                                                  
  87.                                                                 
  88. : CTO"" ( c - a 1)   CTEMP C!  CTEMP 1 ;                        
  89. \ converts character to string.                                 
  90.                                                                 
  91.                                                                 
  92.                                                                 
  93.                                                                 
  94.                                                                 
  95.                                                                 
  96.                                                                 
  97. \ SKIP and SCAN                                                 
  98.                                                                 
  99. : SKIP ( a l c - a2 l2)                                         
  100. \ returns shorter string from first position unequal to byte.   
  101.    >R  BEGIN  DUP                                               
  102.        WHILE  OVER C@ R@ - IF  R> DROP  EXIT  THEN  1 /STRING   
  103.        REPEAT   R> DROP ;                                       
  104.                                                                 
  105. : SCAN ( a l byte - a2 l2)                                      
  106. \ returns shorter string from first position equal to byte.     
  107.    >R  BEGIN  DUP                                               
  108.        WHILE  OVER C@ R@ =  IF  R> DROP  EXIT  THEN  1 /STRING  
  109.        REPEAT   R> DROP ;                                       
  110.                                                                 
  111.                                                                 
  112.                                                                 
  113. \ String compilation                                            
  114.                                                                 
  115. : PLACE ( a n a2)   2DUP !  1+ SWAP CMOVE ;                     
  116. \ moves string ( a n ) to be a packed string at a2.             
  117.                                                                 
  118. : ASCII ( - c)   \ value of following character.                
  119.    BL WORD 1+ C@  STATE @   \ STATE-smart ASCII                 
  120.    IF  [COMPILE] LITERAL  THEN ;  IMMEDIATE                     
  121.                                                                 
  122. : ,"   \ compiles following string as packed string at HERE     
  123.    ASCII " WORD COUNT  DUP >R  HERE PLACE  R> 1+ ALLOT  ALIGN ; 
  124.                                                                 
  125.                                                                 
  126.                                                                 
  127.                                                                 
  128.                                                                 
  129. \ String literals                                               
  130.                                                                 
  131. : (")   I> COUNT  2DUP + >I ;                                   
  132.                                                                 
  133. : " ( - a n)   STATE @   \ string literal.                      
  134.    IF  COMPILE (") ,"                                           
  135.    ELSE  ASCII " WORD COUNT >R  PAD I CMOVE  PAD R>  THEN ;     
  136.   IMMEDIATE                                                     
  137.                                                                 
  138.                                                                 
  139.                                                                 
  140.                                                                 
  141.                                                                 
  142.                                                                 
  143.                                                                 
  144.                                                                 
  145. \ Number conversion operator                                    
  146. VARIABLE DPL  \ punctuation locator.                            
  147.                                                                 
  148. : VAL? ( a n - d 2 , n2 1 , 0)                                  
  149. \ string to number conversion primitive.  True if d is valid.   
  150. \ Returns d if number contains ",-./:"  and sets DPL = 0        
  151. \ Returns n if no punctuation present   and sets DPL = 0<       
  152.    PAD OVER -  SWAP OVER >R  CMOVE                              
  153.    BL PAD C!  PAD DPL !  0 0 R>  DUP C@ ASCII - = DUP >R - 1-   
  154.    BEGIN  CONVERT  DUP C@  DUP ASCII : =                        
  155.      SWAP ASCII , ASCII / 1+ WITHIN  OR                         
  156.    WHILE  DUP DPL !  REPEAT  R> SWAP >R IF  DNEGATE  THEN       
  157.    PAD 1- DPL @ - DPL !  R> PAD = ( valid?)                     
  158.    IF  DPL @ 0< IF DROP 1 ELSE 2 THEN  ELSE  2DROP 0  THEN ;    
  159.                                                                 
  160.                                                                 
  161. \ -TEXT and COMPARE                                             
  162.                                                                 
  163. : -TEXT ( a n a2 - -1 , 0 , 1)                                  
  164. \ returns -1 if string a n < a2 n , 0 if equal, and 1 if >.     
  165.    OVER 0= IF  ROT 2DROP  EXIT  THEN                            
  166.    SWAP 0 DO  OVER C@ OVER C@ - ( these chars <> ?)             
  167.             IF  UNDO  C@ SWAP C@ > 2* 1+  EXIT  THEN  1 1 D+    
  168.           LOOP  2DROP 0 ;                                       
  169.                                                                 
  170. : COMPARE  ( a n a2 n2 - -1 , 0 , 1)                            
  171. \ returns -1 if a n < a2 n2 , 0 if equal, and 1 if >.           
  172.    ROT  2DUP ( lengths ) 2>R  MIN SWAP  -TEXT  DUP              
  173.    IF    2R> 2DROP                                              
  174.    ELSE  DROP  2R> 2DUP = ( lengths = ?)                        
  175.        IF  2DROP 0  ELSE  > 2* 1+  THEN                         
  176.    THEN ;                                                       
  177. \ IN                                                            
  178.                                                                 
  179. : -MATCH ( a n a2 n2 - ???? -1 , offset 0)                      
  180. \ returns the position of string a2 n2 in (a n).                
  181. \ Offset is zero if ( a n ) is found in first char position.    
  182. \ Returns true with invalid offset if ( a n ) isn't in a2 n2.   
  183.    2SWAP  2 PICK DUP ( len1 ) >R  OVER SWAP -  DUP 0< R> 0= OR  
  184.    IF  2DROP 2DROP  TRUE EXIT  THEN                             
  185.    0 TRUE ( index match? )  ROT 1+ 0                            
  186.    DO  DROP ( index ) >R                                        
  187.      2OVER 2OVER DROP  -TEXT 0=  ( equal? )                     
  188.      IF  R> 0 LEAVE  THEN  1 /STRING  R> 1+  TRUE               
  189.    LOOP                                                         
  190.    2>R  2DROP 2DROP  2R> ;                                      
  191.                                                                 
  192.                                                                 
  193. \ Useful string operators                                       
  194.                                                                 
  195. : VAL ( a n - d f)   VAL?  DUP 3 < AND                          
  196. \ converts string to double number.  True if number is valid.   
  197.    DUP IF  1 = IF  S>D  THEN  TRUE EXIT  THEN  DUP DUP ;        
  198.                                                                 
  199. : EVAL ( a n )                                                  
  200. \ evaluates ("text interprets") a string.                       
  201.    DUP >R  TIB SWAP CMOVE  R@ #TIB !                            
  202.    0 >IN ! 0 BLK !  INTERPRET  R> >IN ! ;                       
  203.                                                                 
  204.                                                                 
  205.                                                                 
  206.                                                                 
  207.                                                                 
  208.                                                                 
  209.